{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#糖尿病预测-逻辑回归\n",
    "\n",
    "数据说明：\n",
    "Pima Indians Diabetes Data Set（皮马印第安人糖尿病数据集） 根据现有的医疗信息预测5年内皮马印第安人糖尿病发作的概率。   \n",
    "\n",
    "数据集共9个字段: \n",
    "0列为怀孕次数；\n",
    "1列为口服葡萄糖耐量试验中2小时后的血浆葡萄糖浓度；\n",
    "2列为舒张压（单位:mm Hg）\n",
    "3列为三头肌皮褶厚度（单位：mm）\n",
    "4列为餐后血清胰岛素（单位:mm）\n",
    "5列为体重指数（体重（公斤）/ 身高（米）^2）\n",
    "6列为糖尿病家系作用\n",
    "7列为年龄\n",
    "8列为分类变量（0或1）\n",
    "\n",
    "数据链接：https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\fixes.py:313: FutureWarning: numpy not_equal will not check object identity in the future. The comparison did not return the same result as suggested by the identity (`is`)) and will change.\n",
      "  _nan_object_mask = _nan_object_array != _nan_object_array\n"
     ]
    }
   ],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  Target  \n",
       "0                    0.468492  1.425995       1  \n",
       "1                   -0.365061 -0.190672       0  \n",
       "2                    0.604397 -0.105584       1  \n",
       "3                   -0.920763 -1.041549       0  \n",
       "4                    5.484909 -0.020496       1  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "train = pd.read_csv(\"FE_pima-indians-diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "y_train = train['Target']   \n",
    "X_train = train.drop([\"Target\"], axis=1)\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns \n",
    "\n",
    "#sklearn的学习器大多之一稀疏数据输入，模型训练会快很多\n",
    "#查看一个学习器是否支持稀疏数据，可以看fit函数是否支持: X: {array-like, sparse matrix}.\n",
    "#可自行用timeit比较稠密数据和稀疏数据的训练时间\n",
    "from scipy.sparse import csr_matrix\n",
    "X_train = csr_matrix(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 默认参数的Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr = LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [ 0.48797856  0.53011593  0.4562292   0.422546    0.48392885]\n",
      "cv logloss is: 0.476159709444\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "#数据集比较大，采用3折交叉验证\n",
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "#%timeit loss_sparse = cross_val_score(lr, X_train_sparse, y_train, cv=3, scoring='neg_log_loss')\n",
    "print ('logloss of each fold is: ',-loss)\n",
    "print ('cv logloss is:',-loss.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Logistic Regression + GridSearchCV"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "logistic回归的需要调整超参数有：C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "目标函数为：J =  C* sum(logloss(f(xi), yi)) + penalty \n",
    "\n",
    "在sklearn框架下，不同学习器的参数调整步骤相同：\n",
    "1. 设置参数搜索范围\n",
    "2. 生成学习器实例（参数设置）\n",
    "3. 生成GridSearchCV的实例（参数设置）\n",
    "4. 调用GridSearchCV的fit方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=3, error_score='raise-deprecating',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='liblinear',\n",
       "          tol=0.0001, verbose=0, warm_start=False),\n",
       "       fit_params=None, iid='warn', n_jobs=4,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.01,0.1, 1, 10, 100]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression(solver='liblinear')\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=3, scoring='neg_log_loss',n_jobs = 4,)\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.479019826162\n",
      "{'penalty': 'l1', 'C': 1}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\xujs\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n5kq8HpXFQAPgF8BXZnaacy4zSrGL1AhpzZop0ahqEb/1vlg/l2s3HuC1tkkMb1+q4W9SDkr+chKg\nCgAAC69JREFUqt5Xd6UTfMu75p0Plu8GRHVIRMrEzAJ4t2Mecs6tLSguep5zbhYwK6Le18By4Ba8\nsSgiIlKbKPmrcmdNSYMp3jX/9L1XYeisE9Q4VnVIRLKAfKDon2vNgC3FnJ8M9AP6mNn/hcsCgJlZ\nDnCBc+6LopWcc3lmtgDodKKARo0aRYMGDQqVpaWlkaY+PREREdLT00kvuA8Wtmrrd+Vqy/dExDmX\na2YZwBBgOngZRXj/mWKq7AV6FCm7AzgPuBzYUNznhHtSegLvnyimp556ir59+5byG4iIiNQtxf1x\n/uh7r/LrodeVuS3fE5GwJ4Fp4YRkDt4smnrANAAzmwi0dM5d77wnGhUacGpm24Bs59zyiLJf492a\nWQM0BO4H2gAvVfq3EZE676557/BWlvfY19xQPrF5Ody9PI77Vi4G4MqmjZnS7yd+hljr6JpXvchr\nfmj9+nK1US0SEefcm+E1Qx7BuyWzELgwYuptc+CUMjbbCPhDuO4uIAM40zm3IjpRi4iUbEq/nzDF\n7yDqGF3zqhd5zeenzCeVx8rcRrVIRACcc88Bz5Vw7IYT1B0PjC9Sdi9wb9QCFBERkairFiurioiI\nSN2kRERERER8o0REREREfKNERERERHyjRERERER8o0REREREfKNERERERHyjRERERER8o0RERERE\nfKNERERERHyjRERERER8o0REREREfKNERERERHyjRERERER8o0REREREfKNERERERHyjRERERER8\no0REREREfKNERERERHyjRERERER8o0REREREfKNERERERHyjRERERER8o0REREREfKNERERERHyj\nRERERER8o0REREREfKNERERERHyjRERERER8o0REREREfKNERERERHyjRERERER8o0REREREfKNE\nRERERHyjRERERER8o0REREREfKNERERERHyjRERERER8o0REREREfKNERERERHyjRERERER8U20S\nETO7w8zWm9khM5tlZv1LWe9sM8s1s/nFHLvSzJaH21xkZj+KfuRSUenp6X6HUOfomlc9XfOqp2te\nM1SLRMTMrgaeAB4CTgcWAR+bWdMT1GsAvAx8Vsyxs4C/AH8E+gDvAv8ws9OiG71UlH5YVD1d86qn\na171dM1rhmqRiACjgBedc68451YAtwIHgRtPUO8F4HVgVjHH7gY+dM496Zxb6ZwbB8wH7oxi3CIi\nIlIBviciZhYLpAKfF5Q55xxeL8eZx6l3A9AeGF/CKWdybE/Jx8drU0RERKpWjN8BAE2BILC1SPlW\noGtxFcysMzABGOScC5lZcac1L6HN5hWKVkRERKKmOiQiZWJmAbzbMQ8559YWFEep+QSAESNGkJyc\nXOjAhRdeyEUXXRSlj5FIe/bsYf78Y8YaSyXSNa96uuZVT9e88nz00Ud8/PHHhcr27dtX8DahLG2Z\ndxfEP+FbMweBy51z0yPKpwENnHM/KXJ+A2AXkMfRBCQQfp8HXOCc+8LMNgJPOOeeiaj7MDDMOXd6\nCbGcBcyM0lcTERGpi852zn1V2pN97xFxzuWaWQYwBJgOYN69liHAM8VU2Qv0KFJ2B3AecDmwIVz2\ndTFt/DBcXpKFeONVREREpHxWlOVk3xORsCeBaeGEZA7eLJp6wDQAM5sItHTOXR8eyLossrKZbQOy\nnXPLI4qfBr4ws3uB94E0vCTjppKCcM4dxJtZIyIiIlWgWiQizrk3w2uGPAI0w+uZuNA5tz18SnPg\nlDK2+bWZXQM8Ft5W492WWXb8miIiIlJVfB8jIiIiInWX7+uIiIiISN2lRERERER8o0SkBGb2rplt\nDD8wL9PMXjGzFn7HVVuZWVsze8nM1pnZQTNbbWYPh6d3SyUxs7FmNtPMDpjZTr/jqY3K+0BPKR8z\nO8fMppvZZjMLmdlQv2OqzcxsjJnNMbO9ZrbVzN4xsy5laUOJSMn+BVwJdAH+F+gIvOVrRLXbqXhr\nwdwEnIY3c+pWvIHGUnligTeB5/0OpDYq7wM9pUKS8CY83A5oEGTlOweYAgwEzsf7mfKJmSWWtgEN\nVi0lM7sUeAeId87l+x1PXWBmo4FbnXOd/I6ltjOz64GnnHON/Y6lNjGzWcBs59w94X0DvgWecc49\n7mtwdYCZhYDLIhfLlMoVTrK3Af/jnJtRmjrqESkFM2sMDAdmKgmpUg0B3S6QGqm8D/QUqeEa4vVE\nlfpntxKR4zCz35rZfiALbx2Ty3wOqc4ws07AncALfsciUk7He6CnHr4ptU64x+/3wIyyrNlVpxIR\nM5sYHrxU0pZfZJDN40AfvKXh84FXfQm8BivHNcfMWgEfAm845/7sT+Q1V3muuYhIFDyHN8bvp2Wp\nVC1WVq1CvwOmnuCcdQVvnHM78bqX1pjZCuBbMxvonJtdiTHWNmW65mbWEm+g8Azn3C2VGVgtVqZr\nLpUmC+8PmGZFypsBW6o+HJHKY2bPAj8GznHOfV+WunUqEXHO7QB2lLN6MPwaH6Vw6oSyXPNwT8i/\ngLnAjZUZV21Wwf/PJUrK8UBPkRopnIQMA851zm0qa/06lYiUlpkNAPoDM4BdQCe85+Cs5vhP75Vy\nCveEfAGsB+4HUryf2eCcK3qPXaLEzE4BGgNtgaCZ9Q4fWuOcO+BfZLXGcR/oKdFnZkl4P7MtXNQh\n/P/1Tufct/5FVjuZ2XN4D5UdChwws4IewD3OuexStaHpu8cysx54T+/thTcn/Xu8MQuPlbXLSUon\nPH206HgQw5toECymikSBmU0Frivm0HnOuS+rOp7ayMxux0uuCx7oeZdzbp6/UdVeZnYu8G+OXUPk\nZeecelqjLDxFurhE4gbn3CulakOJiIiIiPilTs2aERERkepFiYiIiIj4RomIiIiI+EaJiIiIiPhG\niYiIiIj4RomIiIiI+EaJiIiIiPhGiYiIiIj4RomIiIiI+EaJiIhUGjP7t5k9WQnt/sfMyvSocTPr\nZmbfmllitOMRkfJTIiIiNYqZDQVSnHN/LVJ+upm9aWZbzOyQma00sz+YWWcA59xyvIdW3udD2CJS\nAiUiIlLT3AVMjSwws0vwkoxY4BrgVOBaYDfek7MLTANuMzP97BOpJvSPUUSqhJk1NLNXzGynmR0w\nsw/MrFORc24ys01mtj/cuzHSzHZFHG8KDAbeiyhLxHty8z+dcz9xzv3LObfROTfXOXc/cEvER3wK\nNAbOrczvKiKlp0RERKrKy0Bf4BLgDMCAD8wsCGBmZwPPA08BfYB/Ab+i8CPGBwEHwrdZClwENAEe\nL+5DnXN7I97nAguBc6LzlUSkomL8DkBEar9wz8elwJnOudnhsuHAt8BlwNvAncAHzrmnwtXWhJOT\niyOaagtsLdJ8Qa/KylKGkxluR0SqAfWIiEhV6AbkAnMKCpxzO/GSh27hoq6Rx8OK7icC2UXKrIyx\nHALqlbGOiFQSJSIiUpNkAY2KlK0Kv55ayjYaA9ujFpGIVIgSERGpCsvxZrQMLCgwsyZ4vSBLw0Ur\ngf5F6g0osr8AaG5mDSLKPgF2APcX98FFzgXoEW5HRKoBJSIiUumcc2uAd4E/mtnZZtYbeA1vjMj0\n8GlTgB+b2Sgz62Rmt+ANRI0crLoAr1fk7Ii2DwIjgIvN7F0zG2Jmbc0s1cwm4Q2ABcDM2gItgc8q\n7cuKSJkoERGRyhSZRNwAZOBNvZ0JhICLnXP5AM65r4BbgVF4M1suwJtBc2RMiHMuhLcWyLWFPsS5\n6cBZQA7wOl4PzF+AZhReR+Qa4BPn3LfR+oIiUjHmnDvxWSIiPjCzPwJdnHPnRpQ1A5YAfcuSUJhZ\nLLAa+KlzblbUgxWRctH0XRGpNszsPrxFxw4APwZ+BtwWeY5zbquZ/T+gDd6tndJqAzymJESkelGP\niIhUG2b2Bt6qp8nAOuAZ59wf/Y1KRCqTEhERERHxjQarioiIiG+UiIiIiIhvlIiIiIiIb5SIiIiI\niG+UiIiIiIhvlIiIiIiIb5SIiIiIiG+UiIiIiIhv/j+Kb8TNE4o3zwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x252764e4f60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'logloss' )\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图给出了L1正则和L2正则下、不同正则参数C对应的模型在训练集上测试集上的logloss。\n",
    "可以看出在训练集和测试集上C逐渐变大时，性能开始变好，然后基本不变；\n",
    "在测试集上当C=1时性能最好（L1正则）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存模型，用于后续测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "pickle.dump(grid.best_estimator_, open(\"diabetes_L1_org_neg_log_loss.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:Anaconda3]",
   "language": "python",
   "name": "conda-env-Anaconda3-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
